package com.ptrsystem.siatd.dao.implementacion;

import com.ptrsystem.siatd.beans.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class ConsultasTdImplement implements com.ptrsystem.siatd.dao.interfaces.ConsultasTdInterface {

    @Autowired
    private DataSource dataSource;

    @Override
    public List<Map> getDetDocumentoReferencia(String Dni) {
        JdbcTemplate jdbc = new JdbcTemplate(this.dataSource);
        List<Map> lista = jdbc.query("select gdd.*,udi.*,upi.*,d.*,u.*,a.* from TD_GEN_DET_DOC_ADM gdd join TD_UNID_PADRE_INTERNO upi on upi.COD_UNI_PAD_INTER=gdd.COD_UNI_PAD_INTER "
                + "join TD_UNID_DEP_INTERNO udi on udi.COD_UNID_DEP_INT=gdd.COD_UNID_DEP_INT join TD_DOCUMENTO d on d.COD_TIPO_DOC=gdd.COD_TIPO_DOC join TD_REG_USUARIO u on u.DNI_USUARIO=gdd.USU_DESTINO join TD_ANNIO a on a.COD_ANNIO=gdd.COD_ANNIO "
                + "where gdd.DNI_USUARIO=?", new Object[]{Dni}, new rowMapperDetDocRef()
        );
        return lista;
    }

    @Override
    public List<Map> getBusDocPersonales(String Dni, String tipDoc, String asunto, String fecha,
            String uniPad, String uniDep) {
        JdbcTemplate jdbc = new JdbcTemplate(this.dataSource);
        List<Map> lista = jdbc.query("select dp.*,d.*,up.*,ud.*,a.*,ecp.*,ru.* from TD_GEN_DOC_PERSONAL dp"
                + " join TD_DOCUMENTO d on dp.COD_TIPO_DOC=d.COD_TIPO_DOC"
                + " join TD_UNID_PADRE_INTERNO up on dp.COD_UNI_PAD_INTER=up.COD_UNI_PAD_INTER"
                + " join TD_UNID_DEP_INTERNO ud on dp.COD_UNI_DEP_INT=ud.COD_UNID_DEP_INT"
                + " join TD_ANNIO a on dp.COD_ANNIO=a.COD_ANNIO"
                + " join TD_ESTADO_COD_PERS ecp on ecp.COD_EST_DOC_PERS=dp.COD_EST_DOC_PERS"
                + " join TD_REG_USUARIO ru on dp.USU_DESTINO_DOC_PERS=ru.DNI_USUARIO"
                + " where dp.DNI_USUARIO=? and d.TIPO_DOC like(?) and dp.ASUNTO_DOC_PERS like(?)"
                + " and dp.FECHA_DOC_PERS like(?) and up.NOM_UNI_PAD_INTER like(?)"
                + " and ud.NOM_DEP_INTERNO like(?)",
                new Object[]{Dni, "%" + tipDoc + "%", "%" + asunto + "%", "%" + fecha + "%",
                    "%" + uniPad + "%", "%" + uniDep + "%"}, new rowMapperBusDocPersonal());
        return lista;
    }

    @Override
    public String getIniDatosUsuario(String dni) {
        JdbcTemplate jdbc = new JdbcTemplate(this.dataSource);
        Usuario usu = jdbc.queryForObject("select * from TD_REG_USUARIO where DNI_USUARIO=?", new Object[]{dni}, new rowMapperIniDatosUsuario());
        String iniPA = String.valueOf(usu.getPriApellido().charAt(0));
        String iniSA = String.valueOf(usu.getSegApellido().charAt(0));
        String iniPr = String.valueOf(usu.getPreNom().charAt(0));
        return iniPA + iniSA + iniPr;
    }

    //row mappers para las listas )
    private class rowMapperDetDocRef implements RowMapper<Map> {

        @Override
        public Map mapRow(ResultSet rs, int i) throws SQLException {
            Map map = new HashMap();
            map.put("nroEmiDocAdm", rs.getString("NRO_EMISION_DOC_ADM"));
            map.put("tipDoc", rs.getString("TIPO_DOC"));
            map.put("nomTipDoc", rs.getString("NOM_TIPO_DOC"));
            map.put("asu", rs.getString("ASUNTO_DOC"));
            map.put("fec", rs.getString("FECHA_DOC"));
            map.put("ani", rs.getString("ANNIO"));
            map.put("des", rs.getString("PRIM_APE_USU") + " " + rs.getString("SEGUN_APE_USU") + ", " + rs.getString("PRE_NOM_USU"));
            map.put("uniPad", rs.getString("NOM_UNI_PAD_INTER"));
            map.put("uniDep", rs.getString("NOM_DEP_INTERNO"));
            map.put("rutDoc", rs.getString("RUTA_DOC"));
            return map;
        }
    }

    private class rowMapperBusDocPersonal implements RowMapper<Map> {

        @Override
        public Map mapRow(ResultSet rs, int i) throws SQLException {
            Map map = new HashMap();
            map.put("numDoc", rs.getString("NRO_EMISION_DOC_ADM"));
            map.put("tipDoc", rs.getString("TIPO_DOC"));
            map.put("nomDoc", rs.getString("NOM_TIPO_DOC_PERS"));
            map.put("asu", rs.getString("ASUNTO_DOC_PERS"));
            map.put("fec", rs.getString("FECHA_DOC_PERS"));
            map.put("usuDes", rs.getString("PRIM_APE_USU") + " " + rs.getString("SEGUN_APE_USU") + ", " + rs.getString("PRE_NOM_USU"));
            map.put("uniPad", rs.getString("NOM_UNI_PAD_INTER"));
            map.put("uniDep", rs.getString("NOM_DEP_INTERNO"));
            map.put("ani", rs.getString("COD_ANNIO"));
            map.put("estDoc", rs.getString("TIPO_EST_DOC_PERS"));
            map.put("rutDoc", rs.getString("RUTA_DOC"));
            return map;
        }
    }

    private class rowMapperIniDatosUsuario implements RowMapper<Usuario> {

        @Override
        public Usuario mapRow(ResultSet rs, int i) throws SQLException {
            Usuario usu = new Usuario();
            usu.setPriApellido(rs.getString("PRIM_APE_USU"));
            usu.setSegApellido(rs.getString("SEGUN_APE_USU"));
            usu.setPreNom(rs.getString("PRE_NOM_USU"));
            return usu;
        }

    }
}
